package com.ddstation.common.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;

/**
 * 日期相关
 * @author zhangdifeng
 * @date 2017年4月27日
 */
public class DateUtil {
	
//    /** 
//     * 计算两个日期相差的天数，如果date2 > date1 返回正数，否则返回负数 
//     *  
//     * @param date1 
//     *          Date 
//     * @param date2 
//     *          Date 
//     * @return long 
//     */ 
//    public static long dayDiff(Date date1, Date date2) { 
//        return (date2.getTime() - date1.getTime()) / 86400000; 
//    }
	
	/**
	 * 识别当天/明天/后天/other
	 * @param _target
	 * @return
	 */
	public static datetime datetimeDiff(Date _target) {
		Date today = new Date();
		int diff = daysBetween(today, _target);
		if (diff == 0) {
			return datetime.today;
		} else if (diff == 1) {
			return datetime.tomorrow;
		} else if (diff == 2) {
			return datetime.afterTomorrow;
		} else if (diff > 2) {
			return datetime.after_afterTomorrow;
		} else {
			return datetime.before_today;
		}
	}
	
    /**  
     * 计算两个日期之间相差的天数  
     * @param smdate 较小的时间 
     * @param bdate  较大的时间 
     * @return 相差天数 
     * @throws ParseException  
     */    
	public static int daysBetween(Date smdate, Date bdate) {    
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        try {
        	smdate = sdf.parse(sdf.format(smdate));  
            bdate = sdf.parse(sdf.format(bdate));
        } catch(ParseException e) {
        	throw new RuntimeException(e);
        }
        Calendar cal = Calendar.getInstance();    
        cal.setTime(smdate);    
        long time1 = cal.getTimeInMillis();                 
        cal.setTime(bdate);    
        long time2 = cal.getTimeInMillis();         
        long between_days=(time2-time1)/(1000*3600*24);  
        return Integer.parseInt(String.valueOf(between_days));           
    }
	
    /**  
     * 日期加减 
     * @param day 日期
     * @param cnt  加减天数
     * @return 加减后日期
     */  
	public static Date addDay(Date day, int cnt) {
		Calendar rightNow = Calendar.getInstance();
		rightNow.setTime(day);
		rightNow.add(Calendar.DAY_OF_YEAR, cnt);
		return rightNow.getTime();
	}
	
	/**  
     * 日期加减月
     * @param day 日期
     * @param cnt  加减月数
     * @return 加减后日期
     */  
	public static Date addMonth(Date day, int cnt) {
		Calendar rightNow = Calendar.getInstance();
		rightNow.setTime(day);
		rightNow.add(Calendar.MONTH, cnt);
		return rightNow.getTime();
	}

	/**
	 * 日期加减年
	 * @param day 日期
	 * @param cnt  加减天数
	 * @return 加减后日期
	 */
	public static Date addYear(Date day, int cnt) {
		Calendar rightNow = Calendar.getInstance();
		rightNow.setTime(day);
		rightNow.add(Calendar.YEAR, cnt);
		return rightNow.getTime();
	}
	
    /**  
     * 取月初日
     * @param cnt  加减月数
     * @return 月初日
     */  
	public static Date getMonthFirstDay(int cnt) {
		Calendar rightNow = Calendar.getInstance();
		rightNow.add(Calendar.MONTH, cnt);
		rightNow.set(Calendar.DAY_OF_MONTH, 1);
		return rightNow.getTime();
	}
	
    /**  
     * 取月末日
     * @return 月末日
     */  
	public static Date getMonthLastDay(int cnt) {
		Calendar rightNow = Calendar.getInstance();
		rightNow.add(Calendar.MONTH, cnt);
		rightNow.set(Calendar.DAY_OF_MONTH, 0);
		return rightNow.getTime();
	}
    
    /**
	 * 时间区分
	 * @author zhangdifeng
	 * @date 2017年3月30日
	 */
	public static enum datetime {
		before_today, today, tomorrow, afterTomorrow, after_afterTomorrow;
	}
	
	/**
	 * 校验日期是否合法
	 * @return
	 */
	public static boolean isValidDate(String date) {
		date = date.replace("年","-");
		date = date.replace("月","-");
		date = date.replace("日","");
		date = date.replaceAll("\\.","-");
		date = date.replaceAll("/", "-");
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		try {
			fmt.parse(date);
			return true;
		} catch (Exception e) {
			// 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
			return false;
		}
	}
	
	/**
	 * 格式化日期
	 * @return
	 */
	public static Date formatDate(String date) {
		date = date.replace("年","-");
		date = date.replace("月","-");
		date = date.replace("日","");
		date = date.replaceAll("\\.","-");
		date = date.replaceAll("/", "-");
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return fmt.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 日期转星期
	 *
	 * @param datetime 字符串
	 * @return
	 */
	public static String dateToWeek(String datetime) {
		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
		String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		Calendar cal = Calendar.getInstance(); // 获得一个日历
		Date datet = null;
		try {
			datet = f.parse(datetime);
			cal.setTime(datet);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
		if (w < 0)
			w = 0;
		return weekDays[w];
	}

	/**
	 * 日期转星期
	 *
	 * @param datetime 日期
	 * @return
	 */
	public static String dateToWeek(Date datetime) {
		String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		Calendar cal = Calendar.getInstance(); // 获得一个日历
		cal.setTime(datetime);
		int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
		if (w < 0)
			w = 0;
		return weekDays[w];
	}

	/**
	 * 日期转星期(数字)
	 *
	 * @param datetime 日期
	 * @return
	 */
	public static int dateToWeekNum(Date datetime) {
		int[] weekDays = { 7, 1, 2, 3, 4, 5, 6 };
		Calendar cal = Calendar.getInstance(); // 获得一个日历
		cal.setTime(datetime);
		int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
		if (w < 0)
			w = 0;
		return weekDays[w];
	}

	/**
	 * 获取当前系统年份
	 *
	 * @return
	 */
	public static String getCurrentYear() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
		Date date = new Date();
		return sdf.format(date);
	}

	/**
	 * 获取当前系统年份
	 *
	 * @return
	 */
	public static String getCurrentMonth() {
		SimpleDateFormat sdf = new SimpleDateFormat("MM");
		Date date = new Date();
		return sdf.format(date);
	}

	/**
	 * 获取当前系统时间
	 *
	 * @return
	 */
	public static String getCurrentTime() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 KK:mm");;
		Date date = new Date();
		return sdf.format(date);
	}
	
	// add by zhengxb 2018.9.7  start-----------------------------------
	/** 
	 * 获取两个时间的时间查 如1天2小时30分钟
	 * 
	 *   注意：两个日期为非空
	 * 
	 * */
    public static String getDatePoor(Date compDate, Date nowDate) {
    	
    	if ( compDate == null ){
    		return "";
    	}
    	
        long nd = 1000 * 24 * 60 * 60;
        long nh = 1000 * 60 * 60;
        long nm = 1000 * 60;
        // long ns = 1000;
        // 获得两个时间的毫秒时间差异
        long diff = nowDate.getTime() - compDate.getTime();
        // 计算差多少天
        long day = diff / nd;
        // 计算差多少小时
        long hour = diff % nd / nh;
        // 计算差多少分钟
        long min = diff % nd % nh / nm;
        // 计算差多少秒//输出结果
        // long sec = diff % nd % nh % nm / ns;
        return day + "天" + hour + "小时" + min + "分钟";
    }
    
    /** 
	 * 获取两个时间的时间查 如1天2小时30分钟
	 * 
	 *   注意：两个日期为非空
	 * 
	 * */
    public static long getDateDiff(Date compDate, Date nowDate) {
    	
    	if ( compDate == null ){
    		return 0;
    	}
    	
        long nd = 1000 * 24 * 60 * 60;
         // long ns = 1000;
        // 获得两个时间的毫秒时间差异
        long diff = nowDate.getTime() - compDate.getTime();
        // 计算差多少天
        long day = diff / nd;
       
        return day;
    }
    // add by zhengxb 2018.9.7  end-----------------------------------
    
    /**
     * 根据 入参 yyyyMM格式的年月，转换成月初日，月末日回传
     * */
    public static String[] getBeginEndDate(String dateYm) {
    	
    	
    	if ( StringUtils.isBlank(dateYm) ){
    		return null;
    	}
    	
    	String outVal[] = new String[2];
    	try {
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
    		Date curMonth = sdf.parse(dateYm.replaceAll("-", ""));
    		
    		// 获取当月第一天和最后一天
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            // 获取前月的第一天
            Calendar cale = Calendar.getInstance();
            cale.setTime(curMonth);

            cale.add(Calendar.MONTH, 0);
            cale.set(Calendar.DAY_OF_MONTH, 1);
            outVal[0] = format.format(cale.getTime());
            // 获取前月的最后一天
            cale.add(Calendar.MONTH, 1);
            cale.set(Calendar.DAY_OF_MONTH, 0);
            outVal[1] = format.format(cale.getTime());
            
		} catch (Exception e) {
			throw new RuntimeException("class[DateUtil],日期转换失败！dataYm："+dateYm);
		}
    	
    	return outVal;
    }
    
    /**
     * 根据 入参 yyyyMM格式的年月，转换成月初日，月末日回传
     * */
    public static String[] getBeginEndDateOneWeek(Calendar cld) {
    	
    	String outVal[] = new String[2];
    	
    	SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
    	cld.setFirstDayOfWeek(Calendar.MONDAY);//以周一为首日
    	cld.setTimeInMillis(System.currentTimeMillis());//当前时间

    	cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//周一
    	outVal[0] = df.format(cld.getTime());
    	cld.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//周日
    	outVal[1] = df.format(cld.getTime());
    	
    	return outVal;
    }
    
    
    /**
     * 根据 入参 yyyy-MM-dd的年月日，设置新的日期
     *      * */
    public static String convDateByDay(String ymd,int day) {
    	try {
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    		Date dDate = sdf.parse(ymd);
    		
            Calendar cal = Calendar.getInstance();
            cal.setTime(dDate);
            cal.set(Calendar.DAY_OF_MONTH, day);
            
            return sdf.format(cal.getTime());
		} catch (Exception e) {
			return null;
		}
    }
}
